/**
 * 给定一个带括号的字符串，每一次进入括号就将括号内的部分reverse，然后大小写互换。
 * 问最终的字符串是多少
 * 显然是一个带有语义动作的文法。但是每一次都执行动作必然超时。
 * 注意到如果是进入括号、又进入括号，则实际上无需操作。
 * 因此需要一个标记量。
 * 然后构造递归实现即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

string S;
map<int, int> Map;
string Output;

void dfs(int left, int right, int flip){
    if(left > right) return;

    vector<tuple<int, int, int>> vec;
    for(int i=left;i<=right;){
        if('(' == S[i]){
            vec.emplace_back(i + 1, Map[i] - 1, 1);
            i = Map[i] + 1;
        }else{
            int o = 0;
            while(i + o <= right and isalpha(S[i + o])) o += 1;
            vec.emplace_back(i, i + o - 1, 0);
            i += o;
        }
    }

    if(flip){
        for(auto it=vec.rbegin(),et=vec.rend();it!=et;++it){
            auto [a, b, t] = *it;
            if(t){
                dfs(a, b, 0);
            }else{
                for(int i=b;i>=a;--i) Output += (char)(S[i] ^ 32);
            }
        }
    }else{
        for(const auto [a, b, t] : vec){
            if(t){
                dfs(a, b, 1);
            }else{
                Output.insert(Output.end(), S.begin() + a, S.begin() + b + 1);
            }
        }
    }
    return;
}

void work(){
    cin >> S;
    int n = S.length(); 
    vector<int> st;
    for(int i=0;i<n;++i){
        if('(' == S[i]){
            st.push_back(i);
        }else if(')' == S[i]){
            Map[st.back()] = i;
            st.pop_back();
        }
    }
    assert(st.empty());

    Output.reserve(n);
    dfs(0, n - 1, 0);
    cout << Output << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}